import { TMap } from '../map'
import { LngLat } from '../entity/lngLat'
import { Polygon, PolygonOptions } from '../covering/polygon'

/**
 * 创建多边形工具时的属性对象
 */
export interface PolygonToolOptions extends PolygonOptions {
    /**
     * 是否显示面积，如果不显示面积，则可以作为画面控件使用
     *
     * 默认值为 `false`
     */
    showLabel?: boolean
}

/**
 * 多边形工具事件工厂对象
 */
type PolygonToolEventFactory = {
    /**
     * 用户双击完成一次折线绘制时触发事件
     *
     * ---
     *
     * - 特殊参数说明：
     *
     * `currentLnglats`：用户当前绘制的多边形的点坐标数组。
     *
     * `currentArea`：用户最后绘制的多边形的地理面积。
     *
     * `currentPolygon`：当前所画多边形对象。
     *
     * `allPolygons`：工具所有绘制的多边形对象
     */
    draw: (event: { type: 'draw', target: PolygonTool, currentLnglats: Array<LngLat>, currentArea: number, currentPolygon: Polygon, allPolygons: Array<Polygon> }) => void;

    /**
     * 用户在多边形绘制过程中，每次点击底图添加节点时触发事件
     *
     * ---
     *
     * - 特殊参数说明：
     *
     * `currentLnglats`：用户当前绘制的多边形的点坐标数组。
     *
     * `currentArea`：用户最后绘制的多边形的地理面积。
     *
     * `currentPolygon`：当前所画多边形对象。
     *
     * `allPolygons`：工具绘制的所有多边形对象
     */
    addpoint: (event: { type: 'addpoint', target: PolygonTool, currentLnglats: Array<LngLat>, currentArea: number, currentPolygon: Polygon, allPolygons: Array<Polygon> }) => void;
}

/**
 * 多边形工具，可以通过事件来获取用户绘制的多边形，包含测面积功能
 */
export interface PolygonTool {
    /**
     * 创建一个多边形工具
     *
     * @param map 地图对象
     *
     * @param opts 属性对象
     */
    new(map: TMap, opts?: PolygonToolOptions): PolygonTool;

    /**
     * 跟随鼠标移动的说明文字
     *
     * @param text 文字内容
     */
    setTips: (text: string) => void;

    /**
     * 计算由地理点组成的多边形的面积
     *
     * @param points 点坐标 `LngLat` 数组
     */
    getArea: (points: Array<LngLat>) => number;

    /**
     * 完成一个多边形的绘制，运行此方法相当于用户点击双击结束当前多边形的绘制
     */
    endDraw: () => void;

    /**
     * 获得所有绘制的多边形
     */
    getPolygons(): () => Array<Polygon>;

    /**
     * 清除所有绘制的多边形
     */
    clear: () => void;
    /**
     * 开启测面积工具
     */
    open: () => boolean;
    /**
     * 关闭测面积工具
     */
    close: () => void;

    /**
     * 添加事件监听函数
     */
    addEventListener: <Event extends keyof PolygonToolEventFactory>(event: Event, handler: PolygonToolEventFactory[Event]) => void;

    /**
     * 移除事件监听函数
     */
    removeEventListener: <Event extends keyof PolygonToolEventFactory>(event: Event, handler: PolygonToolEventFactory[Event]) => void
}
